package co.yixiang.yshop.module.product.service.producttag;

import co.yixiang.yshop.framework.common.pojo.PageResult;
import co.yixiang.yshop.module.product.controller.admin.producttag.param.*;
import co.yixiang.yshop.module.product.controller.admin.producttag.vo.ProductTagViewRespVO;
import co.yixiang.yshop.module.product.convert.producttag.ProductTagConvert;
import co.yixiang.yshop.module.product.convert.producttag.ProductTagGroupConvert;
import co.yixiang.yshop.module.product.dal.dataobject.producttag.ProductTagDO;
import co.yixiang.yshop.module.product.dal.dataobject.producttag.ProductTagGroupDO;
import co.yixiang.yshop.module.product.dal.mysql.producttag.ProductTagGroupMapper;
import co.yixiang.yshop.module.product.dal.mysql.producttag.ProductTagMapper;
import co.yixiang.yshop.module.product.enums.common.PageTypeEnum;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

import static co.yixiang.yshop.framework.common.exception.util.ServiceExceptionUtil.exception;
import static co.yixiang.yshop.module.product.enums.ErrorCodeConstants.PRODUCT_TAG_GROUP_NULL_ERROR;

@Service
public class ProductTagServiceImpl extends ServiceImpl<ProductTagMapper, ProductTagDO> implements ProductTagService {
    @Resource
    private ProductTagGroupMapper productTagGroupMapper;

    @Override
    public int createTag(ProductTagCreateReqParam vo) {
        this.tagGroupSelectById(vo.getGroupId());
        ProductTagDO convert = ProductTagConvert.INSTANCE.convert(vo);
        return baseMapper.insert(convert);
    }

    private ProductTagGroupDO tagGroupSelectById(Long tagGroupId) {
        ProductTagGroupDO productTagGroupDO = productTagGroupMapper.selectById(tagGroupId);
        if (productTagGroupDO == null) {
            throw exception(PRODUCT_TAG_GROUP_NULL_ERROR);
        }
        return productTagGroupDO;
    }

    @Override
    public Boolean updateTag(ProductTagUpdateReqParam vo) {
        this.tagGroupSelectById(vo.getGroupId());
        ProductTagDO convert = ProductTagConvert.INSTANCE.convert(vo);
        return updateById(convert);
    }

    @Override
    public Boolean deleteTag(Long id) {
        return removeById(id);
    }

    @Override
    public PageResult<ProductTagViewRespVO> tagPage(ProductTagSearchReqParam vo) {
        if (PageTypeEnum.NOT_PAGE.getValue().equals(vo.getIsPage())) vo.setPageSize(Integer.MAX_VALUE);
        Long groupId = vo.getGroupId();
        String tagName = vo.getTagName();
        PageResult<ProductTagDO> page = baseMapper.selectPage(vo,
                Wrappers.<ProductTagDO>lambdaQuery()
                        .eq(ObjectUtils.isNotNull(groupId), ProductTagDO::getGroupId, groupId)
                        .like(ObjectUtils.isNotNull(tagName), ProductTagDO::getTagName, tagName)
                        .orderBy(Boolean.TRUE, Boolean.TRUE, ProductTagDO::getSort)
        );
        return ProductTagConvert.INSTANCE.convertPage(page);
    }

    @Override
    public ProductTagViewRespVO findTagById(Long id) {
        ProductTagDO productTagDO = baseMapper.selectById(id);
        return productTagDO != null ? ProductTagConvert.INSTANCE.convert(productTagDO) : null;
    }

    @Override
    public int createTagGroup(ProductTagGroupCreateParam vo) {
        ProductTagGroupDO convert = ProductTagGroupConvert.INSTANCE.convert(vo);
        return productTagGroupMapper.insert(convert);
    }

    @Override
    public int updateTagGroup(ProductTagGroupUpdateParam vo) {
        ProductTagGroupDO convert = ProductTagGroupConvert.INSTANCE.convert(vo);
        return productTagGroupMapper.updateById(convert);
    }

    @Override
    public List<ProductTagGroupDO> listTagGroup() {
        return productTagGroupMapper.selectList(
                Wrappers.<ProductTagGroupDO>lambdaQuery()
                        .orderBy(Boolean.TRUE, Boolean.TRUE, ProductTagGroupDO::getSort)
        );
    }

    @Override
    public int deleteTagGroup(Long id) {
        return productTagGroupMapper.deleteById(id);
    }
}
